package com.lizemin.multicache.service;

import cn.hutool.core.util.StrUtil;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @author lzm
 * @date 2025/4/13 12:20
 * @description 多级缓存管理器
 */
@Service
public class CacheManager {

    @Autowired
    private StringRedisTemplate redisTemplate;

    private final Cache<Object, Object> cache = Caffeine.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build();

    /**
     * 从缓存中查询数据
     *
     * @param key 缓存的key
     * @return 缓存中的数据
     */
    public String getCache(String key) {
        // 先从本地缓存中查询
        String val = (String) cache.getIfPresent(key);
        if (StrUtil.isNotBlank(val)) {
            return val;
        }
        // 本地缓存中没查到，从redis中查
        val = redisTemplate.opsForValue().get(key);
        if (StrUtil.isNotBlank(val)) {
            // 查到了，放到本地缓存中，然后返回
            cache.put(key, val);
            return val;
        }
        // 从redis中也没查到，则返回null
        return null;
    }

    /**
     * 将数据添加到缓存中
     *
     * @param key 缓存的key
     * @param value 缓存的value
     */
    public void setCache(String key, String value) {
        cache.put(key, value);
        redisTemplate.opsForValue().set(key, value, 5, TimeUnit.MINUTES);
    }

    /**
     * 删除缓存
     *
     * @param key 缓存的key
     */
    public void removeCache(String key) {
        cache.invalidate(key);
        redisTemplate.delete(key);
    }

    /**
     * 清空缓存
     */
    public void clearCache() {
        cache.invalidateAll();
        Objects.requireNonNull(redisTemplate.getConnectionFactory()).getConnection().flushDb();
    }

}
